package com.linkai.JVM;

import java.util.ArrayList;
/**
 * @Description: OOM（Out Of Memory）
 *                测试堆内存溢出；堆内存调优
 *                -Xms1m -Xmx8m -XX:+HeapDumpOnOutOfMemoryError
 *
 *                （1）-Xms1024m -Xmx1024m -XX:+PrintGCDetails
 *                     -Xms1024m 设置初始化内存分配大小；
 *                     -Xmx1024m 最大分配内存
 *                     -XX:+PrintGCDetails   打印gc
*
*                 （2）-XX:+HeapDumpOnOutOfMemoryError
 *                     oom dump
 * @Author: 林凯
 * @Date: 2021/10/20 18:29
 */
public class TestOOM {

    byte[] array = new byte[1 * 1024 * 1024];   // 1M

    public static void testOOM() {
        ArrayList<TestOOM> list = new ArrayList<>();
        int count = 0;
        while (true) {
            list.add(new TestOOM());
            System.out.println(++count);
        }
    }

    public static void main(String[] args) {

        testOOM();

        // 返回虚拟机试图使用的最大内存
        long maxMemory = Runtime.getRuntime().maxMemory();
        // 返回 jvm 的总内存
        long totalMemory = Runtime.getRuntime().totalMemory();

        System.out.println("max=" + maxMemory + "字节\t" + (maxMemory/(double)1024 / 1024) + "MB");
        System.out.println("max=" + totalMemory + "字节\t" + (totalMemory/(double)1024 / 1024) + "MB");
        /*
            max=3795845120字节	3620.0MB
            max=257425408字节	245.5MB
        * */

        // 默认情况下：分配的总内存，是电脑内存的 1/4，而初始化额内存：1/64
        // OOM
        // 1. 尝试扩大堆内存看结果
        // 2. 分析内存，看一下那个地方出了问题

        // 元空间：逻辑上存在，物理上不存在。
        // -Xms1024m -Xmx1024m -XX:+PrintGCDetails
        /*
        max=1029177344字节	981.5MB
        max=1029177344字节	981.5MB
        Heap
         PSYoungGen      total 305664K, used 20971K [0x00000000eab00000, 0x0000000100000000, 0x0000000100000000)
          eden space 262144K, 8% used [0x00000000eab00000,0x00000000ebf7afb8,0x00000000fab00000)
          from space 43520K, 0% used [0x00000000fd580000,0x00000000fd580000,0x0000000100000000)
          to   space 43520K, 0% used [0x00000000fab00000,0x00000000fab00000,0x00000000fd580000)
         ParOldGen       total 699392K, used 0K [0x00000000c0000000, 0x00000000eab00000, 0x00000000eab00000)
          object space 699392K, 0% used [0x00000000c0000000,0x00000000c0000000,0x00000000eab00000)
         Metaspace       used 3214K, capacity 4496K, committed 4864K, reserved 1056768K
          class space    used 346K, capacity 388K, committed 512K, reserved 1048576K
        * */

    }
}
